package com.practice.stream;

import com.practice.lambda.entity.EmpList;
import com.practice.lambda.entity.Employee;
import org.junit.Test;

import java.util.List;
import java.util.stream.Stream;

/**
 * Stream中间操作
 * 中间操作若没有终止操作则不会执行
 * 筛选和切片
 * 1. filter - 过滤元素
 * 2. limit(n) - 截断流，限制个数为n
 * 3. skip(n) - 跳过n个，个数不足返回空流
 * 4. distinct - 通过hashCode()和equals()去掉重复元素
 * 5. map - 映射,接收lambda，将元素转换成其他形式或提取信息，接收一个函数作为参数，应用到每一个参数，映射成新元素
 * 6. flatmap - 接收一个函数作为参数，将流中的每一个值都换成另一个流，最后汇总成一个流
 * 7. sorted() - 排序，默认是调用compareTo()，也可以传入lambda重写compareTo()进行排序规则
 *
 * @author hd
 * @date 2022/1/29 10:38
 */
public class StreamOperate {

    /**
     * filter
     */
    @Test
    public void testFilter() {
        final List<Employee> employeeList = new EmpList().getEmployeeList();
        // 中间操作，不会执行任何操作，直到一次终止操作执行全部操作，“惰性求值”
        final Stream<Employee> stream = employeeList.stream().filter(employee -> {
            System.out.println("中间操作");
            return employee.getAge() >= 35;
        });
        // 终止操作
        stream.forEach(System.out::println);

    }

    /**
     * filter
     */
    @Test
    public void testDistinct() {
        final List<Employee> employeeList = new EmpList().getEmployeeList();
        // 中间操作，不会执行任何操作，直到一次终止操作执行全部操作，“惰性求值”
        final Stream<Employee> stream = employeeList.stream().filter(employee -> employee.getAge() >= 35);
        // 终止操作,如果不重写hashCode(),equals()，则distinct不生效
        stream.forEach(System.out::println);
//        stream.distinct().forEach(System.out::println);
    }

    /**
     * map
     */
    @Test
    public void testMap() {
        final List<Employee> employeeList = new EmpList().getEmployeeList();
        employeeList.stream().distinct().map(Employee::getName).forEach(System.out::println);
    }

}
